package com.wn.consumer;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.ResponseTimeWeightedRule;
import feign.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;

/**
 * @author yellow Docter
 * @date 2024-09-06
 * @desc 蜗牛创想：www.woniuxy.com
 *
 *    openfeign的原理2个步骤
 *       1、@EnableFeignClients  + 扫描 把 (@FeignClients 标记的api接口 添加到 IOC容器中)
 *       2、@FeignClients 这个里面标记的 接口进行动态代理
 *              1、StuApi --->proxyStuApi
 *              2、proxyStuApi.xxx的方法的时候
 *                    1、拿到请求方法 请求方式、url、参数
 *                    2、封装 http请求  (HttpTemplate)
 *                    3、RespTemplate = httpTemplate.execute(url,Params);
 *                    4、Object obj = RespTemplate.getResult();
 *                Object boj = StuApi.xxx();
 *
 *   mybatis的原理2个步骤
 *      1、@ComponentScan  + 扫描 把 (@Mapper 或者 mapper 下面的interface 标记的api接口 添加到 IOC容器中)
 *      2、StuMapper--->proxyMapper
 *           proxyMapper的方法的时候
 *           1、拿到参数、sql、方法的名称
 *           2、封装 SqlStatement SQL、xxx
 *           3、   Executor.execute()====> SqlStatement(jdbc操作)
 *           4、   Object obj = jdbc.getResult();
 *      Object obj = proxyMapper.xxx();
 *
 */
@EnableCircuitBreaker  //开启 服务降级配置
@EnableFeignClients("com.stu.api")
@SpringBootApplication
@ComponentScan({
        "com.stu.api.fallback",
        "com.wn.consumer",
})
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }

    @Bean
    public Logger.Level loggerLevel(){
        return Logger.Level.FULL;
    }

    /**
     *  负载均衡的规则配置 : 默认用的是轮询规则
     *
     *  RandomRule                 负载均衡  随机规则
     *  WeightedResponseTimeRule   权重 最小的 相应时间规则
     *  ResponseTimeWeightedRule   相应时间 最小的规则
     * @return
     */
    @Bean
    public IRule rules(){
        return new ResponseTimeWeightedRule();
    }

}
